package config

import (
	"encoding/json"
	"fmt"
	"log"
	"time"
)

/**
 * @Author Administrator
 * @Description 配置项
 * @Date 2023/8/2 21:41
 * @Version 1.0
 */
//
//  Config
//  @Description: 结构体来存储配置项

type Config struct {
	Server    ServerConfig   `yaml:"server" json:"server"`
	Database  DatabaseConfig `yaml:"database" json:"database"`
	Redis     RedisConfig    `yaml:"redis" json:"redis"`
	Upload    UploadConfig   `yaml:"upload" json:"upload"`
	Logs      Logs           `yaml:"logs" json:"logs"`
	RateLimit RateLimit      `yaml:"rateLimit" json:"rateLimit"`
	WhiteList WhiteList      `yaml:"whiteList" json:"whiteList"`
	JwtConfig JwtConfig      `yaml:"jwtConfig" json:"jwtConfig"`
}

func (c Config) JsonString() string {
	// 将结构体转换为JSON字符串
	jsonData, err := json.Marshal(c)
	if err != nil {
		log.Println(fmt.Sprintf("JSON marshaling failed:%s", err))
		return ""
	}
	return string(jsonData)
}

// JwtConfig
//
//	@Description:
type JwtConfig struct {
	Issuer     string        `yaml:"issuer"`     //签发人
	Secret     string        `yaml:"secret"`     //秘钥
	ExpireTime time.Duration `yaml:"expireTime"` //过期时间
}

// WhiteList
// @Description: 拦截器白名单
type WhiteList struct {
	PrefixList []string `yaml:"prefixList"` //前缀列表
	SuffixList []string `yaml:"suffixList"` //后缀列表
	EqualList  []string `yaml:"equalList"`  //相等列表
}

//
//  ServerConfig
//  @Description: 服务器配置

type ServerConfig struct {
	Host string `yaml:"host"`
	Port int    `yaml:"port"`
}

//
//  DatabaseConfig
//  @Description: 数据库配置

type DatabaseConfig struct {
	Dsn  string `yaml:"dsn"`  //数据源配置
	Pool Pool   `yaml:"pool"` //连接池
}

//
//  Pool
//  @Description: 数据库连接池

type Pool struct {
	MaxIdleConnections    uint          `yaml:"maxIdleConnections"`    //表示连接池中最大的空闲连接数
	MaxOpenConnections    uint          `yaml:"maxOpenConnections"`    //表示连接池中最大的打开连接数
	MaxConnectionLifetime time.Duration `yaml:"maxConnectionLifetime"` //表示连接的最大生命周期:超过从连接池移除
	MaxIdleTime           time.Duration `yaml:"maxIdleTime"`           // 表示连接的最大空闲时间:超过关闭连接
}

//
//  RedisConfig
//  @Description: Redis配置

type RedisConfig struct {
	Address  string `yaml:"address"`  //Redis地址
	DbIndex  int    `yaml:"dbIndex"`  //Redis 数据库索引
	Password string `yaml:"password"` //密码
	PoolSize int    `yaml:"PoolSize"` //连接池大小
}

//
//  UploadConfig
//  @Description: 文件上传的路径配置
//

type UploadConfig struct {
	SavePath string `yaml:"savePath"` //保存的路径
}

// Logs
// @Description: 日志相关
type Logs struct {
	Status   bool   `yaml:"status" json:"status,omitempty"`     //状态:true/false代表开/关
	BasePath string `yaml:"baseLog" json:"baseLog"`             //基本路径
	SavePath string `yaml:"savePath" json:"savePath,omitempty"` //日志保存的路径
}

// RateLimit
// @Description: 限速配置
type RateLimit struct {
	MaxRequests int           `yaml:"maxRequests"json:"maxRequests"` //最大请求
	TimeWindow  time.Duration `yaml:"timeWindow" json:"timeWindow"`  //时间窗口
}
